<?php

namespace App\Http\Controllers\Common;

use App\Helpers\Tree;
use App\Http\Controllers\Controller as BaseContoller;
use App\Http\Responses\CustomResponse;
use App\Services\admin\MenuService;
use App\Services\common\SysComService;
use App\Services\common\SysMapService;
use Illuminate\Http\Request;

/**
 * AMIS管理
 */
class AmisController extends BaseContoller
{
    // TODO 跳转页面
    /**
     * 跳转模板页面
     *
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Foundation\Application
     */
    public function view(Request $request, $action)
    {
        return view('admin/index');
    }

    //TODO COM
    // 获取组件配置
    public function getConfig(Request $request, $action)
    {
        $info = SysComService::infoByCode($action);
        if (! $info) {
            return $this->returnTpl(false, $action);
        } // 返回false展示默认页面

        $compiledString = $info->body;
        // 第一遍解析列表 - 并加载 二级页面 主体页面进行解析
        $compiledString = $this->getStrReplace($compiledString);
        if (! $compiledString['code']) {
            return $this->returnTpl(false, $compiledString['action']);
        } // 返回false展示默认页面

        // 第二遍解析 二级页面 并且加载 公共组件 页面进行解析
        $compiledString2 = $this->getStrReplace($compiledString['tpl']);
        if (! $compiledString2['code']) {
            return $this->returnTpl(false, $compiledString2['action']);
        }

        return $this->returnTpl($compiledString2['tpl']);
    }

    // TODO 菜单

    /**
     * 菜单获取接口
     *
     * @return mixed
     */
    public function menu(Request $request)
    {
        // 获得菜单数据
        $menu_list = $request->global['menu']['menu'];

        $returnArray = [
            'pages' => [],
        ];

        if (isset($menu_list)) {
            // 菜单权限逻辑处理
            MenuService::menuPermissions($menu_list);
            // 根据选项渲染节点内容
            $menu_list = MenuService::menuType($menu_list);

            // 构建菜单树
            Tree::init($menu_list, 'parent_id', 'id', 'labed');
            $menu_tree = Tree::get_childall_data();
            $returnArray['pages'] = [
                [
                    'label' => $menu_tree[0]['label'],
                    'url' => '/',
                    'redirect' => $menu_tree[0]['url'],
                ],
                ['children' => $menu_tree],
            ];
        }

        return CustomResponse::success($returnArray, '菜单获取成功');

    }

    /**
     * 解析json字符串里面加载组件
     * Desc: 使用正则表达式匹配需要截取的内容
     * User: zhx
     * Date: 2023/10/27 0027
     * Time: 12:05
     */
    private function getStrReplace($compiledString)
    {
        // 配置字段解析
        $compiledString = str_replace('[&title&]', Request()->global['menu_label'], $compiledString);
        $compiledString = str_replace('[&code&]', Request()->global['menu_code'], $compiledString);

        // 使用正则表达式匹配需要截取的内容
        $pattern = '/\[#(.*?)#\]/';
        preg_match_all($pattern, $compiledString, $matches);

        if (! empty($matches[0])) {
            // 遍历匹配到的内容
            foreach ($matches[1] as $key => $content) {
                // -----------------------------------------------------------------------------------
                // $type 解析类别 com（组件）  map（字典数据）
                // $code 解析参数 com（组件编码）  map（分组编码）
                // $method 解析参数 com（请求附带参数）  map（是否获取选中，列表展示设置）
                // -----------------------------------------------------------------------------------
                // 解析json包含子组件
                [$type, $code, $method] = explode('|', $content);
                switch ($type) {
                    case 'com':
                        // 获取子集组件
                        $sysCodeInfo = SysComService::infoByCode($code);
                        if (! $sysCodeInfo) {
                            return ['code' => false, 'action' => $code];
                        }
                        // 验证类型
                        $compiledString = str_replace($matches[0][$key], $sysCodeInfo->body, $compiledString);

                        // -----------------------------------------------------------------------------------
                        // 单独处理参数
                        // -----------------------------------------------------------------------------------
                        // commonFile_upload_dialog 调用上传组件 表单name动态赋值
                        if ($code == 'commonFile_upload_dialog') {
                            $compiledString = str_replace('[&name&]', $method, $compiledString);
                        }

                        break;
                    case 'map':
                        //                        if ($code = 'install_category') {
                        //                            dd($type, $code, $method);
                        //                        }
                        // 获取字典表信息
                        $mapStrJson = $this->getSysComList($code, $method);
                        if (! $mapStrJson) {
                            return ['code' => false, 'action' => $code];
                        }
                        $compiledString = str_replace($matches[0][$key], $mapStrJson, $compiledString);

                        break;
                }
            }
        }

        return ['code' => true, 'tpl' => $compiledString];
    }

    /**
     * [#map|install_category|#]
     */

    /**
     * 获取字典数据并按照特定格式返回
     * User: zhx
     * Date: 2023/10/30 0030
     * Time: 11:02
     */
    private function getSysComList($code, $selectValue = '')
    {
        $returnArray = [];
        $info = SysMapService::infoByCode($code);
        if (! $info) {
            return false;
        }
        $list = SysMapService::getData(['parent_val' => $info->id]);

        foreach ($list as $key => $item) {
            $returnArray[] = [
                'label' => $item->map_name,
                'value' => $item->map_code,
            ];
        }

        return json_encode($returnArray);
    }

    /**
     * getConfig 返回数据
     * User: zhx
     * Date: 2023/10/30 0030
     * Time: 11:02
     */
    private function returnTpl($json, $action = '')
    {
        // 如果为false 就使用不存在的 实例
        if (! $json) {
            $info = SysComService::infoByCode('sys_com_empty');
            $json = str_replace('[&code&]', $action, $info->body);
        }
        $decodedData = json_decode($json, true);

        return json_encode($decodedData);
    }
}
